package p.ithorns.sample.office.excel;

import java.util.ArrayList;
import java.util.List;

/**
 * MultiHeaderBuilder
 *
 * 多表头构建
 *
 * @author HtL
 * @date 2024/8/29 15:53
 * @since 1.0.0
 */
public class MultiHeaderBuilder {

    public static List<List<String>> build(List<HeaderNode> rootNodes) {
        List<List<String>> allHeaders = new ArrayList<>();
        for (HeaderNode rootNode : rootNodes) {
            List<List<String>> headers = buildHeaderTree(rootNode, 0, new ArrayList<>(rootNodes.size()));
            allHeaders.addAll(headers);
        }
        return allHeaders;
    }

    private static List<List<String>> buildHeaderTree(HeaderNode node, int currentLevel, List<String> currentHeader) {
        List<List<String>> headers = new ArrayList<>(8);

        // 将当前节点的名称添加到当前表头
        currentHeader.add(node.getName());

        // 如果当前节点有子节点，则递归构建子节点的表头
        List<HeaderNode> children = node.getChildren();
        if (null != children && !children.isEmpty()) {
            for (HeaderNode childNode : node.getChildren()) {
                List<String> childHeader = new ArrayList<>(currentHeader);
                List<List<String>> childHeaders = buildHeaderTree(childNode, currentLevel + 1, childHeader);
                headers.addAll(childHeaders);
            }
        } else {
            // 如果没有子节点，则将当前表头添加到结果列表
            headers.add(new ArrayList<>(currentHeader));
        }

        // 移除最后一个元素以准备下一个同级节点的构建
        currentHeader.remove(currentHeader.size() - 1);

        return headers;
    }

}